/* ---------------------------------------------- 头文件包含 ---------------------------------------------- */
#include "./SYSTEM/SYS/sys.h"
#include "./SYSTEM/Task/task_manager.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/USART/bsp_usart.h"
#include "./BSP/OLED/oled.h"
#include "./BSP/BEEP/beep.h"
#include "string.h"

/* -------------------------------------------- 中断向量表控制 -------------------------------------------- */

/**
 * @brief       设置中断向量表偏移地址
 * @param       baseaddr: 基址
 * @param       offset: 偏移量
 * @retval      无
 */
void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset)
{
    /* 设置NVIC的向量表偏移寄存器,VTOR低9位保留,即[8:0]保留 */
    SCB->VTOR = baseaddr | (offset & (uint32_t)0xFFFFFE00);
}

/* -------------------------------------------- 低功耗控制函数 -------------------------------------------- */

/**
 * @brief       执行WFI指令(执行完该指令进入低功耗状态, 等待中断唤醒)
 * @param       无
 * @retval      无
 */
void sys_wfi_set(void)
{
    __ASM volatile("wfi");
}

/**
 * @brief       进入待机模式
 * @param       无
 * @retval      无
 */
void sys_standby(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();    /* 使能电源时钟 */
    SET_BIT(PWR->CR, PWR_CR_PDDS); /* 进入待机模式 */
}

/* -------------------------------------------- 中断控制函数 ---------------------------------------------- */

/**
 * @brief       关闭所有中断(但是不包括fault和NMI中断)
 * @param       无
 * @retval      无
 */
void sys_intx_disable(void)
{
    __ASM volatile("cpsid i");
}

/**
 * @brief       开启所有中断
 * @param       无
 * @retval      无
 */
void sys_intx_enable(void)
{
    __ASM volatile("cpsie i");
}

/* -------------------------------------------- 系统控制函数 ---------------------------------------------- */

/**
 * @brief       设置栈顶地址
 * @note        左侧若出现红X, 属于MDK误报, 实际是没问题的
 * @param       addr: 栈顶地址
 * @retval      无
 */
void sys_msr_msp(uint32_t addr)
{
    __set_MSP(addr);    /* 设置栈顶地址 */
}

/**
 * @brief       系统软复位
 * @param       无
 * @retval      无
 */
void sys_soft_reset(void)
{
    NVIC_SystemReset();
}
/**
 * @brief 系统外设初始化
 * @details 初始化基础外设和驱动
 */
void SystemPeripheralInit(void)
{
    delay_init(72);                 /* 延时初始化 */
    usart_init(115200);             /* 串口初始化为115200 */
}

/**
 * @brief 系统模块初始化
 * @details 初始化各功能模块
 */
void SystemModuleInit(void)
{
    FML_KEY_Init();                 /* 按键初始化 */
    FML_LED_Init();                 /* LED初始化 */
    OLED_Init();                    /* 初始化OLED */
    OLEDTest();                     /* OLED测试 */
    beep_init();                    /* 初始化蜂鸣器 */
}

/**
 * @brief 系统任务初始化
 * @details 创建和启动系统任务
 */
void SystemTaskInit(void)
{
    cotTask_Init();
    cotTask_Creat(ScanKeyTask, 20, 5);              /* 按键扫描任务，20ms执行一次 */
    cotTask_Creat(ScanLedTask, 20, 6);              /* LED控制任务，20ms执行一次 */
//    cotTask_Creat(TestScheduleTask, 1000, 8);       /* 测试调度任务，1秒执行一次 */
    cotTask_Start();
}
